package com.yoomiito.app.base;

import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.res.Resources;
import android.util.DisplayMetrics;

import com.squareup.leakcanary.LeakCanary;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.yoomiito.app.BuildConfig;
import com.yoomiito.app.Constant;
import com.yoomiito.app.broadcastreceiver.NetStateReceiver;
import com.yoomiito.app.model.LiveUserInfo;
import com.yoomiito.app.model.bean.UserInfo;
import com.yoomiito.app.utils.Const;
import com.yoomiito.app.ui.push.UMManager;
import java.io.IOException;

import cn.droidlover.xdroidmvp.cache.SharedPref;
import cn.droidlover.xdroidmvp.net.ApiException;
import cn.droidlover.xdroidmvp.net.NetProvider;
import cn.droidlover.xdroidmvp.net.RequestHandler;
import cn.droidlover.xdroidmvp.net.XApi;
import me.jessyan.autosize.AutoSize;
import me.jessyan.autosize.AutoSizeConfig;
import okhttp3.CookieJar;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;


public class App extends Application {

    private static App mApplication;
    private static Context mContext;
    public static int mWidthPx;
    public static int mHeightPx;
    public static float mDensity;
    public static UserInfo mUserInfo;
    public static IWXAPI msgApi;
    public static AppConfig mAppConfig;
    public static LiveUserInfo mLiveInfo;
    private static String mDeviceId;

    @Override
    public Resources getResources() {
        return super.getResources();

    }

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;
        initAutoSize();
        initSize();
        mApplication = this;
//        registerNetReceiver();
//        registerMvp();
//        initLive();
//        initBaiChuan();


        UMManager.INSTANCE.preInit(this);
        initPushSDK();
        //微信
//        PlatformConfig.setWeixin(Constant.WECHAT_APP_ID, Constant.WECHAT_APP_SECRET);
//        msgApi = WXAPIFactory.createWXAPI(mContext, Constant.WECHAT_APP_ID, false);
//        PlatformConfig.setWXFileProvider("com.qiannianai.app.fileprovider");
        if (BuildConfig.DEBUG) {
            installLeakCanary();
        }
        if (!BuildConfig.DEBUG) {//Bugly
        }


        //初始化Tangram 用于多布局 暂时不用
//        TangramBuilder.init(this, new IInnerImageSetter() {
//            @Override
//            public <IMAGE extends ImageView> void doLoadImageUrl(@NonNull IMAGE view, @Nullable String url) {
//                Glide.with(App.this).load(url).into(view);
//            }
//        }, ImageView.class);
//        getDviceInfo();
    }

    private void registerNetReceiver() {
        NetStateReceiver.Companion.registerReceiver();
    }

    private void initPushSDK() {
        /*
         * 判断用户是否已同意隐私政策
         * 当同意时，直接进行初始化；
         * 当未同意时，待用户同意后，通过PushHelper.init(...)方法进行初始化。
         */
//        boolean agreed = MyPreferences.getInstance(this).hasAgreePrivacyAgreement();
        boolean agreed = SharedPref.getInstance(this).getBoolean(Const.Common.ShowUserPermissionTip,false);
        if(agreed){
//            Intent intent = new Intent(this, AppService.class);
//            intent.putExtra(Constant.TYPE, AllCode.Init);
//            startService(intent);
//
            UMManager.INSTANCE.initUm();
//            ShanYanUtils.INSTANCE.initShanYan(this);
//            if (UMManager.INSTANCE.isMainProcess(this)) {
//                //建议在线程中执行初始化
//                new Thread(new Runnable() {
//                    @Override
//                    public void run() {
//
//                    }
//                }).start();
//            }
        }

    }

    private void installLeakCanary() {
        if (LeakCanary.isInAnalyzerProcess(this)) {
            // This process is dedicated to LeakCanary for heap analysis.
            // You should not init your app in this process.
            return;
        }
        LeakCanary.install(this);
    }

    /**
     * 初始化直播
     */
//    private void initLive() {
//        AppCrashHandler.getInstance(this);
//        DemoCache.setContext(this);
//        NIMClient.init(this, getLoginInfo(), null);
//        StorageUtil.init(this, null);
//        ScreenUtil.init(this);
//        initLog();
////        NimUIKit.init(this, infoProvider, contactProvider);
//        if(inMainProcess()) {
//            // 注册自定义消息附件解析器
//            NIMClient.getService(MsgService.class).registerCustomAttachmentParser(new CustomAttachParser());
//
//            // init pinyin
//            PinYin.init(this);
//            PinYin.validate();
//
//            // 初始化UIKit模块
//            NimUIKit.init(this, infoProvider, contactProvider);
//        }
//    }
//
//    public boolean inMainProcess() {
//        String packageName = getPackageName();
//        String processName = SystemUtil.getProcessName(this);
//        return packageName.equals(processName);
//    }
//
//    private void initLog() {
//        String path = StorageUtil.getDirectoryByDirType(StorageType.TYPE_LOG);
//        LogUtil.init(path, Log.DEBUG);
//        LogUtil.i("demo", " demo log path=" + path);
//    }
//    private UserInfoProvider infoProvider = new UserInfoProvider() {
//        @Override
//        public UserInfo getUserInfo(String account) {
//            UserInfo user = NimUserInfoCache.getInstance().getUserInfo(account);
//            if (user == null) {
//                NimUserInfoCache.getInstance().getUserInfoFromRemote(account, null);
//            }
//
//            return user;
//        }
//
//        @Override
//        public int getDefaultIconResId() {
//            return R.drawable.avatar_def;
//        }
//
//        @Override
//        public Bitmap getTeamIcon(String teamId) {
//            /**
//             * 注意：这里最好从缓存里拿，如果读取本地头像可能导致UI进程阻塞，导致通知栏提醒延时弹出。
//             */
//            // 从内存缓存中查找群头像
//            Team team = TeamDataCache.getInstance().getTeamById(teamId);
//            if (team != null) {
//                Bitmap bm = ImageLoaderKit.getNotificationBitmapFromCache(team.getIcon());
//                if (bm != null) {
//                    return bm;
//                }
//            }
//
//            // 默认图
//            Drawable drawable = getResources().getDrawable(R.drawable.nim_avatar_group);
//            if (drawable instanceof BitmapDrawable) {
//                return ((BitmapDrawable) drawable).getBitmap();
//            }
//
//            return null;
//        }
//
//        @Override
//        public Bitmap getAvatarForMessageNotifier(String account) {
//            /**
//             * 注意：这里最好从缓存里拿，如果读取本地头像可能导致UI进程阻塞，导致通知栏提醒延时弹出。
//             */
//            UserInfo user = getUserInfo(account);
//            return (user != null) ? ImageLoaderKit.getNotificationBitmapFromCache(user.getAvatar()) : null;
//        }
//
//        @Override
//        public String getDisplayNameForMessageNotifier(String account, String sessionId, SessionTypeEnum sessionType) {
//            String nick = null;
//            if (sessionType == SessionTypeEnum.P2P) {
//                nick = NimUserInfoCache.getInstance().getAlias(account);
//            } else if (sessionType == SessionTypeEnum.Team) {
//                nick = TeamDataCache.getInstance().getTeamNick(sessionId, account);
//                if (TextUtils.isEmpty(nick)) {
//                    nick = NimUserInfoCache.getInstance().getAlias(account);
//                }
//            }
//            // 返回null，交给sdk处理。如果对方有设置nick，sdk会显示nick
//            if (TextUtils.isEmpty(nick)) {
//                return null;
//            }
//
//            return nick;
//        }
//    };
//
//    private ContactProvider contactProvider = new ContactProvider() {
//        @Override
//        public List<UserInfoProvider.UserInfo> getUserInfoOfMyFriends() {
//            List<NimUserInfo> nimUsers = NimUserInfoCache.getInstance().getAllUsersOfMyFriend();
//            List<UserInfoProvider.UserInfo> users = new ArrayList<>(nimUsers.size());
//            if (!nimUsers.isEmpty()) {
//                users.addAll(nimUsers);
//            }
//
//            return users;
//        }
//
//        @Override
//        public int getMyFriendsCount() {
//            return FriendDataCache.getInstance().getMyFriendCounts();
//        }
//
//        @Override
//        public String getUserDisplayName(String account) {
//            return NimUserInfoCache.getInstance().getUserDisplayName(account);
//        }
//    };
//    private LoginInfo getLoginInfo() {
//        String account = Preferences.getUserAccount();
//        String token = Preferences.getUserToken();
//        String vodToken = Preferences.getVodToken();
//
//        DemoCache.setVodtoken(vodToken);
//
//        if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(token)) {
//            DemoCache.setAccount(account.toLowerCase());
//            return new LoginInfo(account, MD5.getStringMD5(token));
//        } else {
//            return null;
//        }
//    }
    private void initSize() {
        Resources resources = this.getResources();
        DisplayMetrics displayMetrics = resources.getDisplayMetrics();
        mWidthPx = displayMetrics.widthPixels;
        mHeightPx = displayMetrics.heightPixels;
        mDensity = displayMetrics.density;

        /*
         WindowManager manager = WelcomeActivity.this.getWindowManager();
                Point outSize = new Point();
                Display display = manager.getDefaultDisplay();
                display.getRealSize(outSize);
                int width = outSize.x; //屏幕物理宽度
                int height = outSize.y; //屏幕物理高度
         */
    }

    private void initBaiChuan() {
//        AlibcTradeCommon.turnOnDebug();
//        AlibcTradeBiz.turnOnDebug();
//        AlibcTradeSDK.asyncInit(mApplication, new AlibcTradeInitCallback() {
//            @Override
//            public void onSuccess() {
//                //初始化成功，设置相关的全局配置参数
//                // ...
//                XLog.d("初始化Success");
//            }
//
//            @Override
//            public void onFailure(int code, String msg) {
//                //初始化失败，可以根据code和msg判断失败原因，详情参见错误说明
//                XLog.e("Error","Code:"+code+"   Meg:"+msg);
//            }
//        });
    }

    public static App getApplication() {
        return mApplication;
    }

    public static Context getInstance() {
        return mContext;
    }

//    @Override
//    protected void attachBaseContext(Context base) {
//        super.attachBaseContext(base);
//        MultiDex.install(this) ;
//    }

    private void registerMvp() {
        XApi.registerProvider(new NetProvider() {

            @Override
            public Interceptor[] configInterceptors() {

                return new Interceptor[0];
            }

            @Override
            public void configHttps(OkHttpClient.Builder builder) {
                builder.addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        String token = SharedPref.getInstance(mContext).getString(Constant.TOKEN, "");
//                        String token = "bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8veW1tdC1hcGkuY29tL3Ntc192ZXJpZnlfY29kZSIsImlhdCI6MTU3ODcxMzU1NiwiZXhwIjo4Nzk3ODcxMzU1NiwibmJmIjoxNTc4NzEzNTU2LCJqdGkiOiJvdldqT0Y2d1NQYXc0MFVxIiwic3ViIjo2NTc5OTEyMDYyMzMwMjA4MjU3LCJwcnYiOiI4N2UwYWYxZWY5ZmQxNTgxMmZkZWM5NzE1M2ExNGUwYjA0NzU0NmFhIn0.KnSPMQxd_outqoDSTgRfB4iHM7FUr5olajDV7B6t8kY";

                        Request request = chain.request()
                                .newBuilder()
                                .header("Authorization", token)
                                .header("Site","app_mugwort_android")

//
//                                .header("Authorization", "bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vMTkyLjE2OC4xMC4xMzM6ODA4MC9zbXNfdmVyaWZ5X2NvZGUiLCJpYXQiOjE1NzAxNzE4MjQsImV4cCI6MTYzMjM3OTgyNCwibmJmIjoxNTcwMTcxODI0LCJqdGkiOiJZRlhhQ0liVXkyelpuU3hIIiwic3ViIjo0Nzg4ODYwMjYwMTk2MDk2LCJwcnYiOiI4N2UwYWYxZWY5ZmQxNTgxMmZkZWM5NzE1M2ExNGUwYjA0NzU0NmFhIn0.w8aguwN7x0Os8HR-IC7WpJGeVL621Fsg9BsFVk1yzUE")
                                .header("Platform", "")
                                .build();
//                                .header("platform", "1")
//                                .header("device_model", Build.BRAND + " " + Build.MODEL)
//                                .header("device_system", Build.VERSION.RELEASE);//设备型号
//
//                        builder1.header();
//                                .header("device_id ", )//设备id
//                                .header("system", )
//                        Request request = builder1.build();
                        return chain.proceed(request);
                    }
                });
            }

            @Override
            public CookieJar configCookie() {
                return null;
            }

            @Override
            public RequestHandler configHandler() {
                return null;
            }

            @Override
            public long configConnectTimeoutMills() {
                return 0;
            }

            @Override
            public long configReadTimeoutMills() {
                return 0;
            }

            @Override
            public boolean configLogEnable() {
                return true;
            }//286961

            @Override
            public boolean handleError(ApiException error) {
                return false;
            }

            @Override
            public boolean dispatchProgressEnable() {
                return false;
            }
        });
    }


    private void initAutoSize() {
        //在 Demo 中跳转的三方库中的 DefaultErrorActivity 就是在另外一个进程中, 所以要想适配这个 Activity 就需要调用 initCompatMultiProcess()
        AutoSize.initCompatMultiProcess(this);
        AutoSizeConfig.getInstance()
                .setCustomFragment(true);//支持自定义 Fragment 的适配参数,如果没有这个需求建议不开启
        //是否打印 AutoSize 的内部日志, 默认为 true, 如果您不想 AutoSize 打印日志, 则请设置为 false
//                .setLog(false)
        //是否使用设备的实际尺寸做适配, 默认为 false, 如果设置为 false, 在以屏幕高度为基准进行适配时
        //AutoSize 会将屏幕总高度减去状态栏高度来做适配
        //设置为 true 则使用设备的实际屏幕高度, 不会减去状态栏高度
//                .setUseDeviceSize(true)
        //是否全局按照宽度进行等比例适配, 默认为 true, 如果设置为 false, AutoSize 会全局按照高度进行适配
//                .setBaseOnWidth(false)
        //设置屏幕适配逻辑策略类, 一般不用设置, 使用框架默认的就好
//                .setAutoAdaptStrategy(new AutoAdaptStrategy())

    }

    @Override
    public void unregisterReceiver(BroadcastReceiver receiver) {

    }
}
